package org.example.exampreparationtreasure.controller;

import lombok.RequiredArgsConstructor;
import org.example.exampreparationtreasure.common.CommonResultStatus;
import org.example.exampreparationtreasure.common.QuestionsResponse;
import org.example.exampreparationtreasure.enums.DifficultyLevel;
import org.example.exampreparationtreasure.enums.QuestionType;
import org.example.exampreparationtreasure.model.dto.QuestionQueryDTO;
import org.example.exampreparationtreasure.model.entity.Question;
import org.example.exampreparationtreasure.service.QuestionService;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 题目管理接口
 *
 * 提供题目的增删改查与多条件搜索（按分类、题型、难度、关键字）。
 * 合并了原QuestionsController的录入题目和导出题目功能。
 */
@RestController
@RequestMapping("/api/question")
@RequiredArgsConstructor
public class QuestionController {

    private final QuestionService questionService;
    // private final CategoryService categoryService; // 暂时注释，如需要可启用




    /**
     * 查询题目详情
     *
     * 路径参数：id 题目ID
     */
    @GetMapping("/{id}")
    public Question get(@PathVariable Long id) {
        return questionService.getById(id);
    }

    /**
     * 多条件搜索题目（分页）
     *
     * 请求体：QuestionQueryDTO
     * 分类查询条件：
     * - categoryIds: 分类ID数组，支持无限层级递归查询
     *   * 传入任意层级的分类ID，会自动查询该分类及其所有子孙分类下的题目
     *   * 支持传入多个分类ID，会查询这些分类及其子孙分类的并集
     * 
     * 题目属性查询条件：
     * - types: 题型数组 ["单选","多选","填空","简答题"]
     * - difficulties: 难度数组 ["易","中","难"]
     * 
     * 内容查询条件：
     * - keyword: 题干关键字（模糊匹配JSON中的stem）
     * 
     * 分页参数：
     * - pageNum, pageSize: 分页参数
     * 
     * 返回：{ list, total, pageNum, pageSize }
     * 
     * 使用说明：
     * 1. 先调用 /api/category/tree 获取分类树结构
     * 2. 选择目标分类ID，传入 categoryIds 数组
     * 3. 系统会自动递归查询该分类下所有层级的子孙分类
     * 
     * 示例查询：
     * 1. 查询数学科目下所有题目：{"categoryIds": [1]}
     * 2. 查询数学第一章下所有题目：{"categoryIds": [2]}
     * 3. 查询一元二次方程知识点下的题目：{"categoryIds": [4]}
     * 4. 查询数学和语文两个科目下的中等难度单选题：{"categoryIds": [1, 5], "types": ["单选"], "difficulties": ["中"]}
     */
    @PostMapping("/search")
    public Map<String, Object> search(@RequestBody QuestionQueryDTO dto) {
        List<Question> list = questionService.query(dto);
        Long total = questionService.count(dto);
        Map<String, Object> res = new HashMap<>();
        res.put("list", list);
        res.put("total", total);
        res.put("pageNum", dto.getPageNum());
        res.put("pageSize", dto.getPageSize());
        return res;
    }

    // ========== 以下是从QuestionsController合并的功能 ==========

    /**
     * 创建新题目
     * 
     * @param body 题目信息，包含题目内容、类型、难度等字段
     * @return 创建结果，成功返回题目信息，失败返回错误信息
     */
    @PostMapping("/create")
    public QuestionsResponse create(@RequestBody Question body) {
        try {
            // 设置创建时间和更新时间
            if (body.getCreateTime() == null) {
                body.setCreateTime(LocalDateTime.now());
            }
            if (body.getUpdateTime() == null) {
                body.setUpdateTime(LocalDateTime.now());
            }
            
            // 验证 questionContent 格式
            if (body.getQuestionContent() != null) {
                // 确保 questionContent 是有效的 Map 结构
                if (!(body.getQuestionContent() instanceof Map)) {
                    return QuestionsResponse.fail(CommonResultStatus.PARAM_ERROR.getCode(), "题目内容格式错误，必须是JSON对象");
                }
            }
            
            Long questionId = questionService.create(body);
            if (questionId != null && questionId > 0) {
                body.setQuestionId(questionId);
                return QuestionsResponse.success(body);
            } else {
                return QuestionsResponse.fail(CommonResultStatus.FAIL.getCode(), "创建题目失败，未返回有效的题目ID");
            }
        } catch (Exception e) {
            // 记录异常信息，便于调试
            System.err.println("创建题目时发生异常: " + e.getMessage());
            e.printStackTrace();
            return QuestionsResponse.fail(CommonResultStatus.SERVER_ERROR.getCode(), "创建题目失败: " + e.getMessage());
        }
    }

    /**
     * 更新题目信息
     * 
     * @param id 题目ID
     * @param body 更新后的题目信息
     * @return 更新结果，成功返回更新后的题目信息，失败返回错误信息
     */
    @PutMapping("/update/{id}")
    public QuestionsResponse update(@PathVariable("id") Long id, @RequestBody Question body) {
        body.setQuestionId(id);
        boolean ok = questionService.update(body);
        return ok ? QuestionsResponse.success(body)
                : QuestionsResponse.fail(CommonResultStatus.FAIL.getCode(), CommonResultStatus.FAIL.getMessage());
    }

    /**
     * 删除题目
     * 
     * @param id 题目ID
     * @return 删除结果，成功返回被删除的题目信息，失败返回错误信息
     */
    @DeleteMapping("/delete/{id}")
    public QuestionsResponse delete(@PathVariable("id") Long id) {
        Question toDelete = questionService.getById(id);
        if (toDelete == null) {
            return QuestionsResponse.fail(CommonResultStatus.RECORD_NOT_EXIST.getCode(), CommonResultStatus.RECORD_NOT_EXIST.getMessage());
        }
        
        boolean deleted = questionService.delete(id);
        if (deleted) {
            return QuestionsResponse.success(toDelete);
        } else {
            return QuestionsResponse.fail(CommonResultStatus.FAIL.getCode(), CommonResultStatus.FAIL.getMessage());
        }
    }

    /**
     * 导出题目到Excel文件
     * 支持按分类、题目类型、难度等级进行过滤导出
     * 文件将保存到 src/main/resources/data 目录下
     * 
     * @param categoryId 分类ID，可选过滤条件
     * @param questionType 题目类型，可选过滤条件
     * @param difficulty 难度等级，可选过滤条件
     * @return 包含文件路径信息的响应
     */
    @GetMapping("/export")
    public QuestionsResponse exportToExcel(
            @RequestParam(required = false) Long categoryId,
            @RequestParam(required = false) QuestionType questionType,
            @RequestParam(required = false) DifficultyLevel difficulty) {
        try {
            String filePath = questionService.exportQuestionsToExcel(categoryId, questionType, difficulty);
            
            // 返回文件路径信息
            Map<String, Object> result = new HashMap<>();
            result.put("filePath", filePath);
            result.put("message", "Excel文件导出成功");
            result.put("exportTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            
            return QuestionsResponse.success(result);
                    
        } catch (Exception e) {
            return QuestionsResponse.fail(CommonResultStatus.SERVER_ERROR.getCode(), "导出Excel失败: " + e.getMessage());
        }
    }

    // ========== 以下功能暂时注释，可根据需要启用 ==========
    
    /*
    // 批量导入题目功能（暂时注释）
    @PostMapping("/batchImport/import")
    public QuestionsResponse batchImport(@RequestBody List<Question> list) {
        return QuestionsResponse.success(questionService.importQuestions(list));
    }
    */
}


